home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / CDUNGEON / !CDUNGEON / c / NP1 < prev    next >
Text File  |  1991-05-20  |  7KB  |  416 lines

  1. /* SPARSE-    START OF PARSE */
  2.  
  3. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  4. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  5. /* WRITTEN BY R. M. SUPNIK */
  6.  
  7. #include "funcs.h"
  8. #include "vars.h"
  9.  
  10. #undef EXTERN
  11. #define EXTERN
  12. #define INIT
  13.  
  14. #include "parse.h"
  15.  
  16. /* THIS ROUTINE DETAILS ON BIT 2 OF PRSFLG */
  17.  
  18. integer sparse_(lbuf, llnt, vbflag)
  19. const integer *lbuf;
  20. integer llnt;
  21. logical vbflag;
  22. {
  23.     /* Initialized data */
  24.  
  25. /*     DATA R50MIN/1RA/,R50WAL/3RWAL/ */
  26.     const integer r50min = 1600;
  27.     const integer r50wal = 36852;
  28.  
  29.     /* System generated locals */
  30.     integer ret_val, i__1, i__2;
  31.  
  32.     /* Local variables */
  33.     integer i, j, adj;
  34.     integer obj;
  35.     integer prep, pptr, lbuf1, lbuf2;
  36.     integer buzlnt, prplnt, dirlnt;
  37.  
  38.     /* Parameter adjustments */
  39.     --lbuf;
  40.  
  41.     /* Function Body */
  42.  
  43. /* SET UP FOR PARSING */
  44.  
  45.     ret_val = -1;
  46. /*                         !ASSUME PARSE FAILS. */
  47.     adj = 0;
  48. /*                         !CLEAR PARTS HOLDERS. */
  49.     pv_1.act = 0;
  50.     prep = 0;
  51.     pptr = 0;
  52.     pv_1.o1 = 0;
  53.     pv_1.o2 = 0;
  54.     pv_1.p1 = 0;
  55.     pv_1.p2 = 0;
  56.  
  57.     buzlnt = 20;
  58.     prplnt = 48;
  59.     dirlnt = 75;
  60. /* SPARSE, PAGE 8 */
  61.  
  62. /* NOW LOOP OVER INPUT BUFFER OF LEXICAL TOKENS. */
  63.  
  64.     i__1 = llnt;
  65.     for (i = 1; i <= i__1; i += 2) {
  66. /*                         !TWO WORDS/TOKEN. */
  67.     lbuf1 = lbuf[i];
  68. /*                         !GET CURRENT TOKEN. */
  69.     lbuf2 = lbuf[i + 1];
  70.     if (lbuf1 == 0) {
  71.         goto L1500;
  72.     }
  73. /*                         !END OF BUFFER? */
  74.  
  75. /* CHECK FOR BUZZ WORD */
  76.  
  77.     i__2 = buzlnt;
  78.     for (j = 1; j <= i__2; j += 2) {
  79.         if (lbuf1 == buzvoc_1.bvoc[j - 1] && lbuf2 == buzvoc_1.bvoc[j]) {
  80.         goto L1000;
  81.         }
  82. /* L50: */
  83.     }
  84.  
  85. /* CHECK FOR ACTION OR DIRECTION */
  86.  
  87.     if (pv_1.act != 0) {
  88.         goto L75;
  89.     }
  90. /*                         !GOT ACTION ALREADY? */
  91.     j = 1;
  92. /*                         !CHECK FOR ACTION. */
  93. L125:
  94.     if (lbuf1 == vvoc[j - 1] && lbuf2 == vvoc[j]) {
  95.         goto L3000;
  96.     }
  97. /* L150: */
  98.     j += 2;
  99. /*                         !ADV TO NEXT SYNONYM. */
  100.     if (! (vvoc[j - 1] > 0 && vvoc[j - 1] < r50min)) {
  101.         goto L125;
  102.     }
  103. /*                         !ANOTHER VERB? */
  104.     j = j + vvoc[j - 1] + 1;
  105. /*                         !NO, ADVANCE OVER SYNTAX. */
  106.     if (vvoc[j - 1] != -1) {
  107.         goto L125;
  108.     }
  109. /*                         !TABLE DONE? */
  110.  
  111. L75:
  112.     if (pv_1.act != 0 && (vvoc[pv_1.act - 1] != r50wal || prep != 0)) {
  113.         goto L200;
  114.     }
  115.     i__2 = dirlnt;
  116.     for (j = 1; j <= i__2; j += 3) {
  117. /*                         !THEN CHK FOR DIR. */
  118.         if (lbuf1 == dirvoc_1.dvoc[j - 1] && lbuf2 == dirvoc_1.dvoc[j]) {
  119.         goto L2000;
  120.         }
  121. /* L100: */
  122.     }
  123.  
  124. /* NOT AN ACTION, CHECK FOR PREPOSITION, ADJECTIVE, OR OBJECT. */
  125.  
  126. L200:
  127.     i__2 = prplnt;
  128.     for (j = 1; j <= i__2; j += 3) {
  129. /*                         !LOOK FOR PREPOSITION. */
  130.         if (lbuf1 == prpvoc_1.pvoc[j - 1] && lbuf2 == prpvoc_1.pvoc[j]) {
  131.         goto L4000;
  132.         }
  133. /* L250: */
  134.     }
  135.  
  136.     j = 1;
  137. /*                         !LOOK FOR ADJECTIVE. */
  138. L300:
  139.     if (lbuf1 == avoc[j - 1] && lbuf2 == avoc[j]) {
  140.         goto L5000;
  141.     }
  142.     ++j;
  143. L325:
  144.     ++j;
  145. /*                         !ADVANCE TO NEXT ENTRY. */
  146.     if (avoc[j - 1] > 0 && avoc[j - 1] < r50min) {
  147.         goto L325;
  148.     }
  149. /*                         !A RADIX 50 CONSTANT? */
  150.     if (avoc[j - 1] != -1) {
  151.         goto L300;
  152.     }
  153. /*                         !POSSIBLY, END TABLE? */
  154.  
  155.     j = 1;
  156. /*                         !LOOK FOR OBJECT. */
  157. L450:
  158.     if (lbuf1 == ovoc[j - 1] && lbuf2 == ovoc[j]) {
  159.         goto L600;
  160.     }
  161.     ++j;
  162. L500:
  163.     ++j;
  164.     if (ovoc[j - 1] > 0 && ovoc[j - 1] < r50min) {
  165.         goto L500;
  166.     }
  167.     if (ovoc[j - 1] != -1) {
  168.         goto L450;
  169.     }
  170.  
  171. /* NOT RECOGNIZABLE */
  172.  
  173.     if (vbflag) {
  174.         rspeak_(601);
  175.     }
  176.     return ret_val;
  177. /* SPARSE, PAGE 9 */
  178.  
  179. /* OBJECT PROCESSING (CONTINUATION OF DO LOOP ON PREV PAGE) */
  180.  
  181. L600:
  182.     obj = getobj_(j, adj, 0);
  183. /*                         !IDENTIFY OBJECT. */
  184.     if (obj <= 0) {
  185.         goto L6000;
  186.     }
  187. /*                         !IF LE, COULDNT. */
  188.     if (obj != oindex_1.itobj) {
  189.         goto L650;
  190.     }
  191. /*                         !"IT"? */
  192.     obj = getobj_(0, 0, last_1.lastit);
  193. /*                         !FIND LAST. */
  194.     if (obj <= 0) {
  195.         goto L6000;
  196.     }
  197. /*                         !IF LE, COULDNT. */
  198.  
  199. L650:
  200.     if (prep == 9) {
  201.         goto L8000;
  202.     }
  203. /*                         !"OF" OBJ? */
  204.     if (pptr == 2) {
  205.         goto L7000;
  206.     }
  207. /*                         !TOO MANY OBJS? */
  208.     ++pptr;
  209.     objvec[pptr - 1] = obj;
  210. /*                         !STUFF INTO VECTOR. */
  211.     prpvec[pptr - 1] = prep;
  212. L700:
  213.     prep = 0;
  214.     adj = 0;
  215. /* Go to end of do loop (moved "1000 CONTINUE" to end of module, to av
  216. oid */
  217. /* complaints about people jumping back into the doloop.) */
  218.     goto L1000;
  219. /* SPARSE, PAGE 10 */
  220.  
  221. /* SPECIAL PARSE PROCESSORS */
  222.  
  223. /* 2000--    DIRECTION */
  224.  
  225. L2000:
  226.     prsvec_1.prsa = vindex_1.walkw;
  227.     prsvec_1.prso = dirvoc_1.dvoc[j + 1];
  228.     ret_val = 1;
  229.     return ret_val;
  230.  
  231. /* 3000--    ACTION */
  232.  
  233. L3000:
  234.     pv_1.act = j;
  235.     orphs_1.oact = 0;
  236.     goto L1000;
  237.  
  238. /* 4000--    PREPOSITION */
  239.  
  240. L4000:
  241.     if (prep != 0) {
  242.         goto L4500;
  243.     }
  244.     prep = prpvoc_1.pvoc[j + 1];
  245.     adj = 0;
  246.     goto L1000;
  247.  
  248. L4500:
  249.     if (vbflag) {
  250.         rspeak_(616);
  251.     }
  252.     return ret_val;
  253.  
  254. /* 5000--    ADJECTIVE */
  255.  
  256. L5000:
  257.     adj = j;
  258.     j = orphs_1.oname & orphs_1.oflag;
  259.     if (j != 0 && i >= llnt) {
  260.         goto L600;
  261.     }
  262.     goto L1000;
  263.  
  264. /* 6000--    UNIDENTIFIABLE OBJECT (INDEX INTO OVOC IS J) */
  265.  
  266. L6000:
  267.     if (obj < 0) {
  268.         goto L6100;
  269.     }
  270.     j = 579;
  271.     if (lit_(play_1.here)) {
  272.         j = 618;
  273.     }
  274.     if (vbflag) {
  275.         rspeak_(j);
  276.     }
  277.     return ret_val;
  278.  
  279. L6100:
  280.     if (obj != -10000) {
  281.         goto L6200;
  282.     }
  283.     if (vbflag) {
  284.         rspsub_(620, objcts_1.odesc2[advs_1.avehic[play_1.winner - 1]
  285.              - 1]);
  286.     }
  287.     return ret_val;
  288.  
  289. L6200:
  290.     if (vbflag) {
  291.         rspeak_(619);
  292.     }
  293.     if (pv_1.act == 0) {
  294.         pv_1.act = orphs_1.oflag & orphs_1.oact;
  295.     }
  296.     orphan_(- 1, pv_1.act, pv_1.o1, prep, j);
  297.     return ret_val;
  298.  
  299. /* 7000--    TOO MANY OBJECTS. */
  300.  
  301. L7000:
  302.     if (vbflag) {
  303.         rspeak_(617);
  304.     }
  305.     return ret_val;
  306.  
  307. /* 8000--    RANDOMNESS FOR "OF" WORDS */
  308.  
  309. L8000:
  310.     if (objvec[pptr - 1] == obj) {
  311.         goto L700;
  312.     }
  313.     if (vbflag) {
  314.         rspeak_(601);
  315.     }
  316.     return ret_val;
  317.  
  318. /* End of do-loop. */
  319.  
  320. L1000:
  321.     ;
  322.     }
  323. /*                         !AT LAST. */
  324.  
  325. /* NOW SOME MISC CLEANUP -- We fell out of the do-loop */
  326.  
  327. L1500:
  328.     if (pv_1.act == 0) {
  329.     pv_1.act = orphs_1.oflag & orphs_1.oact;
  330.     }
  331.     if (pv_1.act == 0) {
  332.     goto L9000;
  333.     }
  334. /*                         !IF STILL NONE, PUNT. */
  335.     if (adj != 0) {
  336.     goto L10000;
  337.     }
  338. /*                         !IF DANGLING ADJ, PUNT. */
  339.  
  340.     if (orphs_1.oflag != 0 && orphs_1.oprep != 0 && prep == 0 && pv_1.o1 != 0 
  341.         && pv_1.o2 == 0 && pv_1.act == orphs_1.oact) {
  342.     goto L11000;
  343.     }
  344.  
  345.     ret_val = 0;
  346. /*                         !PARSE SUCCEEDS. */
  347.     if (prep == 0) {
  348.     goto L1750;
  349.     }
  350. /*                         !IF DANGLING PREP, */
  351.     if (pptr == 0 || prpvec[pptr - 1] != 0) {
  352.     goto L12000;
  353.     }
  354.     prpvec[pptr - 1] = prep;
  355. /*                         !CVT TO 'PICK UP FROB'. */
  356.  
  357. /* 1750--    RETURN A RESULT */
  358.  
  359. L1750:
  360. /*                         !WIN. */
  361.     return ret_val;
  362. /*                         !LOSE. */
  363.  
  364. /* 9000--    NO ACTION, PUNT */
  365.  
  366. L9000:
  367.     if (pv_1.o1 == 0) {
  368.     goto L10000;
  369.     }
  370. /*                         !ANY DIRECT OBJECT? */
  371.     if (vbflag) {
  372.     rspsub_(621, objcts_1.odesc2[pv_1.o1 - 1]);
  373.     }
  374. /*                         !WHAT TO DO? */
  375.     orphan_(- 1, 0, pv_1.o1, 0, 0);
  376.     return ret_val;
  377.  
  378. /* 10000--    TOTAL CHOMP */
  379.  
  380. L10000:
  381.     if (vbflag) {
  382.     rspeak_(622);
  383.     }
  384. /*                         !HUH? */
  385.     return ret_val;
  386.  
  387. /* 11000--    ORPHAN PREPOSITION.  CONDITIONS ARE */
  388. /*         O1.NE.0, O2=0, PREP=0, ACT=OACT */
  389.  
  390. L11000:
  391.     if (orphs_1.oslot != 0) {
  392.     goto L11500;
  393.     }
  394. /*                         !ORPHAN OBJECT? */
  395.     pv_1.p1 = orphs_1.oprep;
  396. /*                         !NO, JUST USE PREP. */
  397.     goto L1750;
  398.  
  399. L11500:
  400.     pv_1.o2 = pv_1.o1;
  401. /*                         !YES, USE AS DIRECT OBJ. */
  402.     pv_1.p2 = orphs_1.oprep;
  403.     pv_1.o1 = orphs_1.oslot;
  404.     pv_1.p1 = 0;
  405.     goto L1750;
  406.  
  407. /* 12000--    TRUE HANGING PREPOSITION. */
  408. /*         ORPHAN FOR LATER. */
  409.  
  410. L12000:
  411.     orphan_(- 1, pv_1.act, 0, prep, 0);
  412. /*                         !ORPHAN PREP. */
  413.     goto L1750;
  414.  
  415. } /* sparse_ */
  416.